package com.dexter.year2024.cp1_linkedlist.level1_bronze;

/**
 * 【第一章-链表基础-青铜挑战-插入/删除链表结点】
 */
public class OperateLinkedList {

    /**
     * 插入结点
     *
     * @param head       链表头结点
     * @param nodeInsert 待插入结点
     * @param position   待插入结点位置
     * @return
     */
    public static InitLinkedList.ListNode insertNode(InitLinkedList.ListNode head, InitLinkedList.ListNode nodeInsert, int position) {
        // 原链表为空，新结点为头结点
        if (head == null) return nodeInsert;
        // 获取链表长度
        int size = InitLinkedList.getListLength(head);
        // 注意点1：怎么判定越界
        if (position > size + 1 || position < 1) {
            System.out.println("待插入结点位置不合法");
            return head;
        }
        // 插入头结点
        if (position == 1) {
            nodeInsert.next = head;
            return nodeInsert;
        }
        // 插入中间或尾结点
        InitLinkedList.ListNode pNode = head;
        // 注意点2：count怎么规定终止
        int count = 1;
        while (count < position - 1) {
            // 移动当前结点
            pNode = pNode.next;
            count++;
        }
        // 移动到 position-1 的位置了，即需要插入的前一个结点
        nodeInsert.next = pNode.next;
        pNode.next = nodeInsert;
        return head;
    }

    public static void main(String[] args) {
        // 创建链表
        int[] arr = {1, 2, 3, 4, 5};
        InitLinkedList.ListNode head = InitLinkedList.initLinkedList(arr);
        // 插入结点
        InitLinkedList.ListNode node = insertNode(head, new InitLinkedList.ListNode(6), 3);
        InitLinkedList.printLinkedList(node);
        // TODO 删除结点
    }
}
